//
//  IWxChatMgrGroup.h
//  WXIMSDK
//  提供对好友添加、删除、接受、拒绝等操作
//  Created by vince on 14-9-5.
//  Copyright (c) 2014年 网信金融集团. All rights reserved.
//


#import <Foundation/Foundation.h>
#import "EWxChatMgrGroupDelegate.h"

@class ChatGroup;
@class ChatContact;
@class ChatGroupMember;


@interface IWxChatMgrGroup : NSObject

+ (IWxChatMgrGroup *)sharedGroup;



/*!
 @method
 @brief  异步方法，初始化并获取自己的所有群组信息
 @return 初始化执行成功or失败
 */
- (BOOL)initAllContactGroups;

- (void)initAllContactGroups:(void (^)(BOOL state))completion;

/*!
 @method
 @brief  获取当前用户的所有群组列表
 @return 返回ChatGroup对象数组
 */
- (NSMutableArray *)getContactGroups;


/*!
 @method
 @brief  creatGroup
 @param  groupName      群组名称
 @param  groupDesc      群组描述信息
 @param  maxNum         群成员最大数限制
 @param  yesorno        是否是公开群　０不公开，１公开
 @param  approval       是否需要审批加入，此属性只针对公开群组有效
 @return 返回这个方法     creatGroupNameRspState:
 */
- (void)creatGroupName:(NSString *)groupName groupDesc:(NSString *)groupDesc memberMax:(NSInteger)maxNum isPublic:(BOOL)yesorno isApproval:(BOOL)isapproval delegate:(id)delegate;

/*!
 @method
 @brief        异步方法,    更新群组
 @param        groupId     群组ID
 @param        groupName   群组新名称
 @param        maxNum      群成员最大数限制
 @discussion   updateGroupIdRspState:chatGroup:error:
 */
- (void)updateGroupId:(NSString *)groupId groupName:(NSString *)groupName memberMax:(NSInteger)maxNum delegate:(id)delegate;

/*!
 @method
 @brief        异步方法,    更新群组（除名称外所有）属性
 @param        groupId     群组ID
 @param        groupDesc   群组描述信息
 @param        maxNum      群成员最大数限制
 @param        public      是否是公开群 　０不公开，１公开
 @param        approval    是否需要审批加入，此属性只针对公开群组有效
 @discussion   updateGroupIdRspState:chatGroup:error:
 */
- (void)updateGroupId:(NSString *)groupId groupDesc:(NSString *)groupDesc memberMax:(NSInteger)maxNum ispublic:(BOOL)ispublic isNeedapproval:(BOOL)isNeed delegate:(id)delegate;

/*!
 @method
 @brief        异步方法,   更新群组所有属性
 @param        groupId    群组ID
 @param        groupName  群组新名称
 @param        groupDesc  群组描述信息
 @param        maxNum     群成员最大数限制
 @param        public     是否是公开群 　０不公开，１公开
 @param        approval   是否需要审批加入，此属性只针对公开群组有效
 @discussion   updateGroupIdRspState:chatGroup:error:
 */
- (void)updateGroupId:(NSString *)groupId groupName:(NSString *)groupName groupDesc:(NSString *)groupDesc memberMax:(NSInteger)maxNum ispublic:(BOOL)ispublic isNeedapproval:(BOOL)isNeed delegate:(id)delegate;



/*!
 @method
 @brief       同步方法, 获取群组对象信息
 @param       groupId  群组ID
 @discussion  返回ChatGroup对象，若groupId不存在则返回nil
 */
- (ChatGroup *)getGroupInfoByGroupId:(NSString *)groupId;

/*!
 @method
 @brief      异步方法, 删除某个群组
 @param      groupId 要退出的群组Id
 @discussion
 @result     回调方法deleteGroupIdRspState:groupId:
 */
- (void)deleteGroupId:(NSString *)groupId delegate:(id)delegate;


/*!
 @method     同步方法
 @brief      获取该群所有成员
 @param      groupid 群组Id
 @discussion 若groupId不存在，返回nil
 @result     返回群组成员ChatGroupMember对象数组
 */
- (NSMutableArray *)getAllGroupMembersByGroupId:(NSString *)groupId;

/*!
 @method     同步方法
 @brief      读取某一群组的某一个成员信息
 @param      groupid 群组Id
 @param      memberId 群成员Id
 @discussion 若groupId不存在，返回nil；若memberId不存在，返回nil
 @result     返回群组成员ChatGroupMember对象数组
 */
- (ChatGroupMember *)getGroupMembersByGroupId:(NSString *)groupId withMemberId:(NSString*)memberId;

/*!
 @method
 @brief     异步方法, 邀请群组新成员
 @param     ChatContact 被邀请好友对象
 @param     groupId 要加入的群组id
 @result    回调inviteGroupMemberRspState:groupId:error:
 */
- (void)inviteGroupMember:(ChatContact *)memberObj joinGroupId:(NSString *)groupId delegate:(id)delegate;

/*!
 @method
 @brief     异步方法, 邀请群组新成员
 @param     memberArry 被邀请好友ChatContact对象列表
 @param     groupid 要加入的群组id
 @result    回调inviteGroupMemberRspState:groupId:error:
 */
- (void)inviteGroupMemberArry:(NSArray *)memberArry joinGroupId:(NSString *)groupId delegate:(id)delegate;

/*!
 @method
 @brief      异步方法, 踢出群成员
 @param      memberId 踢出成员对象
 @param      groupId 群组Id
 @result     回调kickoffGroupMemberRspState:groupId:errorMsg:
 */
- (void)kickoffGroupMember:(NSString *)memberId fromGroupId:(NSString *)groupId delegate:(id)delegate;

/*!
 @method
 @brief       异步方法, 请求加入群组
 @param       message  附带消息
 @result      回调requestJoinGroupIdRspState:groupId:errorMsg:
 */
- (void)requestJoinGroupId:(NSString *)groupId message:(NSString *)message delegate:(id)delegate;

/*!
 @method
 @brief       异步方法,     设置群成员昵称
 @param       groupId      群组ID
 @discussion  只针对当前登录用户有效
 @result      回调方法setGroupNicknameRspState:inGroupId:
 */
- (void)setGroupNickname:(NSString *)nickName inGroupId:(NSString *)groupId delegate:(id)delegate;

/*!
 @method
 @brief       异步方法， 主动退出某群组
 @param       groupId 要退出的群组Id
 @discussion
 @result      回调方法quitGroupIdRspState:groupId:
 */
- (void)quitGroupId:(NSString *)groupId delegate:(id)delegate;

/*!
 @method
 @brief       异步方法， 接收加入某群的邀请 (管理员收到请求后允许申请者加入)
 @param       memberId 发出邀请的成员Id
 @param       groupId  将要加入的群组Id
 @result      回调方法acceptGroupMemberIdRspState:memberId:joinGroupId:
 */
- (void)acceptGroupMemberId:(NSString *)memberId toJoinGroupId:(NSString *)groupId delegate:(id)delegate;

/*!
 @method
 @brief       异步方法， 拒绝加入某群的邀请 (管理员收到请求后拒绝申请者加入)
 @param       memberId 发出邀请的成员Id
 @param       groupId  将要加入的群组Id
 @result      回调方法rejectGroupMemberIdRspState:memberId:joinGroupId:
 */
- (void)rejectGroupMemberId:(NSString *)memberId toJoinGroupId:(NSString *)groupId delegate:(id)delegate;

/*!
 @method
 @brief      异步方法， 管理员移交管理员身份 (将自己管理员身份移交给其他人员，不需要对方确认，但对方会受到通知)
 @param      groupId  将要转换管理员权限的群组Id
 @param      adminId  将要接收管理员身份的新管理员Id
 @result     回调方法abdicateAdmininstrationGroupIdRspState:groupId:
 */
 - (void)abdicateAdmininstrationGroupId:(NSString *)groupId toAdminId:(NSString *)adminId delegate:(id)delegate;


- (void)registDelegate:(id<EWxChatMgrGroupDelegate>)delegate;

- (void)unregistDelegate:(id<EWxChatMgrGroupDelegate>)delegate;


/*!
 @method
 @brief       同步方法， 判断在GroupList中该GroupId是否存在
 @param       groupId  将要加入的群组Id
 @result      YES/NO
 */
- (BOOL)judgeInGroupListIsHaveGroupId:(NSString*)groupId;

/*!
 @method
 @brief       同步方法， 删除与某个联系人聊天所有记录
 @param       groupId  将要删除的群聊Id
 @result      YES/NO
 */
- (BOOL)deleteAllMessageToContactId:(NSString *)contactId;
@end
